package com.sx.sx1.lintcode.day717;

public class LC202 {


    static class SegmentTreeNode {
        public int start, end, max;
        public SegmentTreeNode left, right;

        public SegmentTreeNode(int start, int end, int max) {
            this.start = start;
            this.end = end;
            this.max = max;
            this.left = this.right = null;
        }
    }


    static class Solution {
        /**
         * @param root:  The root of segment tree.
         * @param start: start value.
         * @param end:   end value.
         * @return: The maximum number in the interval [start, end]
         */
        public int query(SegmentTreeNode root, int start, int end) {
            //https://blog.csdn.net/roufoo/article/details/88896310
            //mid必须以root->start和root->end为准，而不是start和end为准。
            // 因为线段树就是根据root->start和root->end来划分的。
            //start和end都是与mid比较，而不是与root->start和root->end比较。
            if(root.start >= start && root.end <= end) return root.max;

            int m = root.start + ((root.end - root.start) >> 1);
            int leftv = Integer.MIN_VALUE;
            int rightv = Integer.MIN_VALUE;

            if (m >= start) {
                leftv = query(root.left,start,Math.min(m,end));
            }

            if (m < end) {
                rightv = query(root.right,m>=start?m+1:start,end);
            }

            return Math.max(leftv, rightv);
        }
    }

}


/*
LintCode-Logo
搜索题目、标签、题集
中文
avatar
您有181条未读消息，请及时查看
202 · 线段树的查询
算法
中等
通过率
43%

题目
题解17
笔记
讨论99+
排名
记录
描述
对于一个有n个数的整数数组，在对应的线段树中, 根节点所代表的区间为0-n-1, 每个节点有一个额外的属性max，值为该节点所代表的数组区间start到end内的最大值。

为SegmentTree设计一个 query 的方法，接受3个参数root, start和end，根据给定的线段树根，找出区间[start，end]中的最大值。

最短时间刷“透”算法面试：《66页算法宝典》.pdf

微信添加【jiuzhangfeifei】备注【66】领取


在做此题之前，请先完成 线段树构造 这道题目。

样例
样例 1:

输入："[0,3,max=4][0,1,max=4][2,3,max=3][0,0,max=1][1,1,max=4][2,2,max=2][3,3,max=3]",1,2
输出：4
解释：
对于数组 [1, 4, 2, 3], 对应的线段树为 :

	                  [0, 3, max=4]
	                 /             \
	          [0,1,max=4]        [2,3,max=3]
	          /         \        /         \
	   [0,0,max=1] [1,1,max=4] [2,2,max=2], [3,3,max=3]
[1,2]区间最大值为4
样例 2:

输入："[0,3,max=4][0,1,max=4][2,3,max=3][0,0,max=1][1,1,max=4][2,2,max=2][3,3,max=3]",2,3
输出：3
解释：
对于数组 [1, 4, 2, 3], 对应的线段树为 :

	                  [0, 3, max=4]
	                 /             \
	          [0,1,max=4]        [2,3,max=3]
	          /         \        /         \
	   [0,0,max=1] [1,1,max=4] [2,2,max=2], [3,3,max=3]
[2,3]区间最大值为3
相关知识
学习《 高级数据结构：线段树、树状数组》课程中的1.11如何查询线段树相关内容 ，了解更多相关知识！
标签
相关题目

833
进程序列
中等

203
线段树的修改
中等

751
约翰的生意
中等

247
线段树查询 II
中等

201
线段树的构造
中等
推荐课程

ACM金牌逐行带刷班
最适合懒人的刷题课--躺平看算法大神在线coding，讲解思路+现场debug，手撕面试高频题
已开启智能提示
发起考试
30 分 00 秒
12345678910111213141516171819202122232425

public int query(SegmentTreeNode root, int start, int end) {
    // write your code here
}
}
控制台
        历史提交

 */
